home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / unixSyscall / RCS / wait.c,v < prev    next >
Text File  |  1991-10-02  |  7KB  |  322 lines

  1. head     1.6;
  2. branch   ;
  3. access   ;
  4. symbols  sprited:1.6.1;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.6
  10. date     91.09.23.18.22.55;  author mottsmth;  state Exp;
  11. branches 1.6.1.1;
  12. next     1.5;
  13.  
  14. 1.5
  15. date     88.07.29.18.54.36;  author ouster;  state Exp;
  16. branches ;
  17. next     1.4;
  18.  
  19. 1.4
  20. date     88.07.29.18.39.31;  author ouster;  state Exp;
  21. branches ;
  22. next     1.3;
  23.  
  24. 1.3
  25. date     88.07.29.17.40.54;  author ouster;  state Exp;
  26. branches ;
  27. next     1.2;
  28.  
  29. 1.2
  30. date     88.06.21.17.25.17;  author ouster;  state Exp;
  31. branches ;
  32. next     1.1;
  33.  
  34. 1.1
  35. date     88.06.19.14.32.12;  author ouster;  state Exp;
  36. branches ;
  37. next     ;
  38.  
  39. 1.6.1.1
  40. date     91.10.02.12.48.20;  author kupfer;  state Exp;
  41. branches ;
  42. next     ;
  43.  
  44.  
  45. desc
  46. @@
  47.  
  48.  
  49. 1.6
  50. log
  51. @Special case for wait3: return 0 if no children have exited,
  52. rather than return -1.
  53. @
  54. text
  55. @/* 
  56.  * wait.c --
  57.  *
  58.  *    Procedure to map from Unix wait system call to Sprite.
  59.  *
  60.  * Copyright (C) 1986 Regents of the University of California
  61.  * All rights reserved.
  62.  */
  63.  
  64. #ifndef lint
  65. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/wait.c,v 1.5 88/07/29 18:54:36 ouster Exp Locker: mottsmth $ SPRITE (Berkeley)";
  66. #endif not lint
  67.  
  68. #include <sprite.h>
  69. #include <proc.h>
  70. #include <spriteTime.h>
  71.  
  72. #include "compatInt.h"
  73.  
  74. #include <sys/wait.h>
  75. #include <sys/time.h>
  76. #include <sys/resource.h>
  77. #include <status.h>
  78.  
  79.  
  80. /*
  81.  *----------------------------------------------------------------------
  82.  *
  83.  * wait --
  84.  *
  85.  *    Procedure to map from Unix wait system call to Sprite Proc_Wait.
  86.  *
  87.  * Results:
  88.  *    If wait returns due to a stopped or terminated child process,
  89.  *    the process ID of the child is returned to the calling process.
  90.  *    In addition, if statusPtr is non-null then fields in *statusPtr
  91.  *    will be set to contain the exit status of the child whose process
  92.  *    ID is returned.
  93.  *
  94.  *    Otherwise, UNIX_ERROR is returned and errno is set to indicate
  95.  *    the error.
  96.  *
  97.  * Side effects:
  98.  *    None.
  99.  *
  100.  *----------------------------------------------------------------------
  101.  */
  102.  
  103. int
  104. wait(statusPtr)
  105. union wait *statusPtr;
  106. {
  107.     ReturnStatus status;    /* result returned by Proc_Wait */
  108.     int pid;            /* process ID of child */
  109.     int reason;            /* reason child exited */
  110.     int childStatus;        /* returnStatus of child */
  111.     int subStatus;        /* additional signal status */
  112.     int    unixSignal;
  113.  
  114.     status = Proc_Wait(0, (int *) NULL, PROC_WAIT_BLOCK, &pid, &reason,
  115.             &childStatus, &subStatus, (Proc_ResUsage *) NULL);
  116.     if (status != SUCCESS) {
  117.     errno = Compat_MapCode(status);
  118.     return(UNIX_ERROR);
  119.     } else {
  120.     if (statusPtr != NULL)  {
  121.         statusPtr->w_status = 0;
  122.         if (reason == PROC_TERM_SUSPENDED) {
  123.         (void)Compat_SpriteSignalToUnix(childStatus, &unixSignal);
  124.         statusPtr->w_stopval = WSTOPPED;
  125.         statusPtr->w_stopsig = unixSignal;
  126.         } else if (reason == PROC_TERM_SIGNALED ||
  127.                reason == PROC_TERM_RESUMED) {
  128.         (void)Compat_SpriteSignalToUnix(childStatus, &unixSignal);
  129.         statusPtr->w_termsig = unixSignal;
  130.         /* NEED TO HANDLE coredump FIELD */
  131.         } else {
  132.         statusPtr->w_retcode = childStatus;
  133.         }
  134.     }
  135.     return((int) pid);
  136.     }
  137. }
  138.  
  139.  
  140. /*
  141.  *----------------------------------------------------------------------
  142.  *
  143.  * wait3 --
  144.  *
  145.  *    Procedure to map from Unix wait3 system call to Sprite Proc_Wait.
  146.  *
  147.  * Results:
  148.  *    If wait returns due to a stopped or terminated child process,
  149.  *    the process ID of the child is returned to the calling process.
  150.  *    In addition, if statusPtr is non-null then fields in *statusPtr
  151.  *    will be set to contain the exit status of the child whose process
  152.  *    ID is returned.
  153.  *
  154.  *    Otherwise, UNIX_ERROR is returned and errno is set to indicate
  155.  *    the error.
  156.  *
  157.  * Side effects:
  158.  *    None.
  159.  *
  160.  *----------------------------------------------------------------------
  161.  */
  162.  
  163. wait3(statusPtr, options, unixRusagePtr)
  164.     union    wait    *statusPtr;
  165.     int            options;
  166.     struct    rusage    *unixRusagePtr;
  167. {
  168.     Proc_ResUsage spriteRusage;
  169.     ReturnStatus status;    /* result returned by Proc_Wait */
  170.     int pid;            /* process ID of child */
  171.     int reason;            /* reason child exited */
  172.     int childStatus;        /* returnStatus of child */
  173.     int subStatus;        /* additional signal status */
  174.     int    flags = 0;
  175.  
  176.     if (!(options & WNOHANG)) {
  177.     flags |= PROC_WAIT_BLOCK;
  178.     }
  179.     if (options & WUNTRACED) {
  180.     flags |= PROC_WAIT_FOR_SUSPEND;
  181.     }
  182.  
  183.     status = Proc_Wait(0, (int *) NULL, flags, &pid, &reason, 
  184.         &childStatus, &subStatus, &spriteRusage);
  185.     if (status != SUCCESS) {
  186.     if ((status == PROC_NO_EXITS) && (options & WNOHANG)) {
  187.         return(0);
  188.     }
  189.     errno = Compat_MapCode(status);
  190.     return(UNIX_ERROR);
  191.     } else {
  192.     if (statusPtr != NULL)  {
  193.         int    unixSignal;
  194.         statusPtr->w_status = 0;
  195.         if (reason == PROC_TERM_SUSPENDED) {
  196.         (void)Compat_SpriteSignalToUnix(childStatus, &unixSignal);
  197.         statusPtr->w_stopval = WSTOPPED;
  198.         statusPtr->w_stopsig = unixSignal;
  199.         } else if (reason == PROC_TERM_SIGNALED ||
  200.                reason == PROC_TERM_RESUMED) {
  201.         (void)Compat_SpriteSignalToUnix(childStatus, &unixSignal);
  202.         statusPtr->w_termsig = unixSignal;
  203.         /* NEED TO HANDLE coredump FIELD */
  204.         } else {
  205.         statusPtr->w_retcode = childStatus;
  206.         }
  207.     }
  208.     if (unixRusagePtr != NULL) {
  209.         /*
  210.          * Return the total time used by the process and all its children.
  211.          */
  212.         Time totalKTime;
  213.         Time totalUTime;
  214.  
  215.         bzero((char *) unixRusagePtr, sizeof(*unixRusagePtr));
  216.         Time_Add(spriteRusage.userCpuUsage, spriteRusage.childUserCpuUsage,
  217.                         &totalUTime);
  218.         Time_Add(spriteRusage.kernelCpuUsage,
  219.              spriteRusage.childKernelCpuUsage, &totalKTime);
  220.         unixRusagePtr->ru_utime.tv_sec = totalUTime.seconds;
  221.         unixRusagePtr->ru_utime.tv_usec = totalUTime.microseconds;
  222.         unixRusagePtr->ru_stime.tv_sec = totalKTime.seconds;
  223.         unixRusagePtr->ru_stime.tv_usec = totalKTime.microseconds;
  224.         unixRusagePtr->ru_nvcsw = spriteRusage.numWaitEvents;
  225.         unixRusagePtr->ru_nivcsw = spriteRusage.numQuantumEnds;
  226.     }
  227.     return((int) pid);
  228.     }
  229. }
  230. @
  231.  
  232.  
  233. 1.6.1.1
  234. log
  235. @Initial branch for Sprite server.
  236. @
  237. text
  238. @d11 1
  239. a11 1
  240. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/wait.c,v 1.6 91/09/23 18:22:55 mottsmth Exp $ SPRITE (Berkeley)";
  241. @
  242.  
  243.  
  244. 1.5
  245. log
  246. @Lint.
  247. @
  248. text
  249. @d11 1
  250. a11 1
  251. static char rcsid[] = "$Header: wait.c,v 1.4 88/07/29 18:39:31 ouster Exp $ SPRITE (Berkeley)";
  252. d131 3
  253. @
  254.  
  255.  
  256. 1.4
  257. log
  258. @Lint.
  259. @
  260. text
  261. @d11 1
  262. a11 1
  263. static char rcsid[] = "$Header: wait.c,v 1.3 88/07/29 17:40:54 ouster Exp $ SPRITE (Berkeley)";
  264. d60 1
  265. a60 1
  266.             &childStatus, &subStatus, (int *) NULL);
  267. @
  268.  
  269.  
  270. 1.3
  271. log
  272. @Lint.
  273. @
  274. text
  275. @d11 1
  276. a11 1
  277. static char rcsid[] = "$Header: wait.c,v 1.2 88/06/21 17:25:17 ouster Exp $ SPRITE (Berkeley)";
  278. d53 1
  279. a53 1
  280.     Proc_PID pid;        /* process ID of child */
  281. d59 2
  282. a60 2
  283.     status = Proc_Wait(0, (Proc_PID *) NULL, PROC_WAIT_BLOCK, &pid, &reason,
  284.             &childStatus, &subStatus, (Proc_PID *) NULL);
  285. d115 1
  286. a115 1
  287.     Proc_PID pid;        /* process ID of child */
  288. d128 1
  289. a128 1
  290.     status = Proc_Wait(0, (Proc_PID *) NULL, flags, &pid, &reason, 
  291. d157 1
  292. a157 1
  293.         bzero(unixRusagePtr, sizeof(*unixRusagePtr));
  294. @
  295.  
  296.  
  297. 1.2
  298. log
  299. @Various changes to make code compile under new library.
  300. @
  301. text
  302. @d11 1
  303. a11 1
  304. static char rcsid[] = "$Header: wait.c,v 1.1 88/06/19 14:32:12 ouster Exp $ SPRITE (Berkeley)";
  305. @
  306.  
  307.  
  308. 1.1
  309. log
  310. @Initial revision
  311. @
  312. text
  313. @d11 1
  314. a11 1
  315. static char rcsid[] = "$Header: wait.c,v 1.12 88/04/27 19:16:52 nelson Exp $ SPRITE (Berkeley)";
  316. d14 3
  317. a16 3
  318. #include "sprite.h"
  319. #include "proc.h"
  320. #include "/sprite/lib/include/time.h"
  321. @
  322.